/*
 * 内部类：在一个类的内部定义的类（嵌套类）
 * （内部类与外部类的称呼是相对应的）
 * 
 * 内部类的种类：成员类、局部内部类、静态类、匿名内部类
 * 
 * 成员类：当作外部类的成员而存在；（在内部类中可加上private、public、protected等修饰符）
 * 局部内部类：是包含在外部类的某一方法中的内部类，该作用域在局限于方法的范围；
 * 静态类：定义时加上static关键字；（嵌套类）
 * 		静态内部类只能访问外部类中的静态成员变量
 * 匿名内部类：没有自己名字的内部类，且必须是非静态类；
 */

package outerClass;

class OuterA {	//外部类（相对）

//	内部类
	private int x=1;
	//内部类是依赖外部类而存在的
	class Inner{	//内部类（相对）
		private int y=2;
		public void print() {
			System.out.println("Inner:"+x++);
		}
	};
	
	public void func() {
		Inner inner=new Inner();
		inner.print();
//		new Inner().print();//内部调用
	}
	
	//-------------------------------
//	局部内部类（在方法里）
	void Bfunc() {
		@SuppressWarnings("hiding")
		class Inner{
			private void print() {
				System.out.println("这是局部内部类！");
			}
		}
		
		Inner inner=new Inner();
		inner.print();
	}
	
	//---------------------------
//	静态类
	static int a=10;
	public static class InnerClassStatic{
		void print() {
			System.out.println("innerstatic:"+a);
		}
	}
		
}

abstract class Person{
	public abstract void name();
}

public class Outer{
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		OuterA outerA=new OuterA();
		OuterA.Inner inner=outerA.new Inner();//外部调用
		inner.print();
		
		outerA.Bfunc();
		
		OuterA.InnerClassStatic innerstatic=new OuterA.InnerClassStatic();
		innerstatic.print();
		
		Person p=new Person() {
			public void name() {
				System.out.println("JEYMING");;
				
			}
		};
		p.name();
		
		Person p2=new Person() {
			public void name() {
				System.out.println("No 2:");
				System.out.println("Hello world");;
				
			}
		};
		p2.name();
	}
}
